export default {
  namespaced: true, // 开启命名空间
  state: {
    // 购物车的数组，用来存储购物车中每个商品的信息对象
    // 每个商品的信息对象，都包含如下 6 个属性：
    // { goods_id, goods_name, goods_price, goods_count, goods_small_logo, goods_state }
    cart: JSON.parse(uni.getStorageSync('cart') || '[]'),
    isChecked: JSON.parse(uni.getStorageSync('isChecked') || 'false')
  },
  mutations: {
    //添加到购物车的思路：
    /* 
    使用数组的find方法判断该商品是否在cart数组中，
      不存在 => push到数组中
      存在 => 数量增加1
    */
    addToCart(state, good) {
      const resGood = state.cart.find(x => x.goods_id === good.goods_id);
      if (!resGood) {
        state.cart.push(good);
      } else {
        resGood.goods_count++;
      }

      this.commit('m_cart/saveCart');
    },

    //将购物车的商品信息持久化存储到本地
    saveCart(state) {
      uni.setStorageSync('cart', JSON.stringify(state.cart));
    },

    //将全选框的状态保存在本地
    saveIsChecked(state) {
      uni.setStorageSync('isChecked', JSON.stringify(state.isChecked));
    },

    //修改商品的勾选状态并保存在本地
    updateGoodState(state, good) {
      const res = state.cart.find(x => x.goods_id === good.goods_id)
      if (res) {
        res.goods_state = good.goods_state;
        this.commit('m_cart/saveCart');
      }
      //每次点击单选按钮时，判断已勾选数组的长度是否等于cart的长度，
      /* 
        相等 => isChecked=true,全选框处于勾选；
      */
      if (state.cart.filter(x => x.goods_state).length === state.cart.length) {
        state.isChecked = true;
        //将全选按钮的状态持久化存储在本地
      } else {
        state.isChecked = false;
      }
      this.commit('m_cart/saveIsChecked');
    },

    //更新商品数量并保存在本地
    updateGoodCount(state, good) {
      const res = state.cart.find(x => x.goods_id === good.goods_id);
      if (res) {
        res.goods_count = good.value;
        this.commit('m_cart/saveCart');
      }
    },
    //根据id删除存储在本地的商品
    removeGood(state, good) {
      state.cart = state.cart.filter(x => x.goods_id !== good.goods_id);
      this.commit('m_cart/saveCart');
    },
      
    //更新全选框状态
    clickAllRadio(state) {
      state.isChecked = !state.isChecked;
      if(state.isChecked ){
         state.cart.filter(x => !x.goods_state).forEach(good => good.goods_state = true);
         
      }else{
        state.cart.forEach(good=>good.goods_state=false);
      }
     this.commit('m_cart/saveCart');
      this.commit('m_cart/saveIsChecked');
    },
  },
  //相当于计算属性
  getters: {
    //购物车商品数量的动态生成
    /* 
    首先在getters属性中声明一个函数返回该商品的数量x.goods_count
    之后在页面中注册该函数，最后用watch监听该函数的返回值，该值的变化会触发一个回调函数，在回调函数中将新值赋值给options数组的购物车配置对象的info属性
    */
    addedCount(state) {
      let c = 0;

      state.cart.forEach(ag => c += ag.goods_count);

      return c;
    },

    //计算已勾选商品的总数量
    checkedCount(state) {
      return state.cart.filter(x => x.goods_state).reduce((total, good) => total += good.goods_count, 0)
    },

    //计算已勾选商品的总价钱
    checkedOverallPrice(state) {
      /* 
          假设满足条件的数组有三个商品，第一次循环得到cart[0],price=cart[0].goods_price * cart[0].goods_count;
          第二次循环得到cart[1],price=cart[1].goods_price * cart[1].goods_count + money;
          第三次循环得到cart[2],price=cart[2].goods_price * cart[2].goods_count + money;
      */
      return state.cart.filter(x => x.goods_state).reduce((money, good) => money += good.goods_price * good.goods_count,
        0).toFixed(2);
    },
  }
};